package com.webauto.data_driver;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import com.webauto.log.Log;
import com.webauto.pojo.WriteData;

/**
 * PS:用例工具类
 * 
 * @author lkk
 *
 */
public class CaseUtil {
	/**
	 * PS:根据获取字段,字段值获取指定表类型对象
	 * 
	 * @param <T>
	 * @param field     指定字段名
	 * @param value     字段值
	 * @param list      检索的集合
	 * @param cellNames 相关表字段的集合
	 * @param clazz     集合实体类字节码对象
	 * @return 数据数组
	 */
	public static <T> Object[][] getExcelEntity(String field, String value, List<T> list, String[] cellNames,
			Class<T> clazz) {
		// 存储遍历结果的集合
		List<T> resultList = new ArrayList<T>();
		// 将字段名首字母大写
		StringBuffer sb = new StringBuffer(field);
		sb.replace(0, 1, String.valueOf(field.charAt(0)).toUpperCase());
		// get字段值方法名
		String methodString = "get" + sb.toString();
		// get方法对象
		Method method = null;
		try {
			method = clazz.getMethod(methodString);
		} catch (NoSuchMethodException | SecurityException e1) {
			Log.error("+++根据指定字段的值获取指定反射对象的方法对象失败+++");
		}
		// 遍历接口信息对象集合,获取接口信息对象
		for (T excelEntity : list) {
			try {
				if (method.invoke(excelEntity).equals(value)) {
					T entity = excelEntity;
					resultList.add(entity);
				}
			} catch (Exception e) {
				Log.error("+++根据获取字段,字段值获取指定表类型对象方法在遍历获取反射对象时失败了+++");
			}
		}
		// 调用方法转为二维对象数组
		Object[][] data = convertListforArrays(resultList, cellNames, clazz);
		return data;
	}

	/**
	 * PS:将指定泛型集合转为二维数组
	 * 
	 * @param <T>
	 * @param list      需要转换的泛型集合
	 * @param cellNames 泛型相关实体类的字段数组
	 * @param clazz     泛型相关实体类的字节码对象
	 * @return 集合转换的二维数组
	 */
	public static <T> Object[][] convertListforArrays(List<T> list, String[] cellNames, Class<T> clazz) {
		// 存放结果的二维数组
		Object[][] data = new Object[list.size()][cellNames.length];
		// 遍历集合获取实体类对象
		for (int i = 0; i < list.size(); i++) {
			T entity = list.get(i);
			// 遍历实体类.通过反射获取字段值
			for (int j = 0; j < cellNames.length; j++) {
				try {
					// 获取指定字段的get方法对象
					Method method = clazz.getMethod("get" + cellNames[j]);
					// 调用get方法获取值
					String value = (String) method.invoke(entity);
					data[i][j] = value;
				} catch (Exception e) {
					Log.error("+++将指定泛型集合转为二维数组时调用反射方法失败+++");
				}
			}
		}
		return data;
	}
	
	/**
	 * PS:根据实际情况写入数据到excel中
	 * @param flag 判断是否通过
	 * @param sheetName 表名
	 * @param caseNum 用例编号
	 * @param field 字段
	 * @param result 写入结果
	 */
	public static void writeData(boolean flag,String sheetName,String caseNum,String field,String result) {
		// 新建需要写入的结果对象
		WriteData actualResponseResult = null;
		// 判断是否通过,决定写入excel内容
		if (flag == true) {
			actualResponseResult = new WriteData("用例", caseNum, "ActualResult", "pass");
		} else {
			actualResponseResult = new WriteData("用例", caseNum, "ActualResult", result);
		}
		// 将该对象加入最终写入集合中
		ExcelUtil.writeDataList.add(actualResponseResult);
	}
}
